﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MCDS;
using System.Xml;

namespace Cartography.Desktop
{
    public partial class formPreferenciasMCDS : Form
    {
        private MCDS.MCDS mcdsVariable;
        public formPreferenciasMCDS()
        {
            InitializeComponent();
            this.dgvPreferencias.CellValidating += new DataGridViewCellValidatingEventHandler(dgvPreferencias_CellValidating);
            this.dgvPreferencias.CellEndEdit += new DataGridViewCellEventHandler(dgvPreferencias_CellEndEdit);
        }

        private void cbClave_SelectedIndexChanged(object sender, EventArgs e)
        {

            mcdsVariable = new MCDS.MCDS(FormPrincipal.Instance.TilesFolder);
            dgvTemporalidad.Columns.Clear();
            DataTable tabla = mcdsVariable.CrearMatriz(cbClave.Text);
            DataTable tablaTemporalidad = mcdsVariable.CrearMatrizTemporalidad(cbClave.Text);
            dgvPreferencias.DataSource = tabla;
            dgvTemporalidad.DataSource = tablaTemporalidad;
            adicionarColumnaTemporalidad();
            dgvPreferencias.Refresh();
            dgvTemporalidad.Refresh();
            DesabilitarCeldas();
            
        }
        private void DesabilitarCeldas() 
        {
            DataTable tabla;
            if (dgvPreferencias.DataSource != null)
            {
                tabla = (DataTable)dgvPreferencias.DataSource;
                if (tabla != null)
                    for (int i = 0; i < tabla.Rows.Count; i++)
                    {
                        for (int j = 1; j < tabla.Columns.Count; j++)
                        {
                            if (dgvPreferencias.Rows[i].Cells[j].Value.ToString().Equals(""))
                            {
                                dgvPreferencias.Rows[i].Cells[j].ReadOnly = true;
                                dgvPreferencias.Rows[i].Cells[j].Style.BackColor = Color.Gray;
                            }
                        }
                        dgvPreferencias.Rows[i].Cells[0].ReadOnly = true;
                    }
                for (int j = 0; j < tabla.Rows.Count; j++)
                {
                    dgvPreferencias.Rows[j].Cells[0].ReadOnly = true;
                }
            }
            if (dgvTemporalidad.DataSource != null)
            {
                tabla = (DataTable)dgvTemporalidad.DataSource;
                for (int j = 0; j < tabla.Rows.Count; j++)
                {
                    dgvTemporalidad.Rows[j].Cells[0].ReadOnly = true;
                }
            }
        }

        //****************************** dgvPreferencias *******************************
        private void dgvPreferencias_CellValidating(object sender,DataGridViewCellValidatingEventArgs e)
        {
            if (dgvPreferencias.DataSource == null) return;

            string headerText = dgvPreferencias.Columns[e.ColumnIndex].HeaderText;

            //Confirm taht the cell in not read only

            if (dgvPreferencias.Rows[e.RowIndex].Cells[e.ColumnIndex].ReadOnly) return;

            // Confirm that the cell is not empty.
            if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
            {
                dgvPreferencias.Rows[e.RowIndex].ErrorText = "La celda no acepta nulo";
                e.Cancel = true;
            }
            else 
            {
                if (e.ColumnIndex == 0) return;
                if (int.Parse(e.FormattedValue.ToString()) < 1) 
                {
                    dgvPreferencias.Rows[e.RowIndex].ErrorText = "No se aceptan numero menores a 1";
                    e.Cancel = true;
                }
            }
        }

        void dgvPreferencias_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            // Clear the row error in case the user presses ESC.   
            dgvPreferencias.Rows[e.RowIndex].ErrorText = String.Empty;
        }
         
        //********************* validar solo numero **************************************
        private void OnlyNumbers_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8) // Si no es numerico 
            {
                // Invalidar la accion
                e.Handled = true;
            }
        }

        private void dgvPreferencias_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            TextBox txt = e.Control as TextBox;
            txt.KeyPress += OnlyNumbers_KeyPress;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                mcdsVariable.guardarPreferencias((DataTable)dgvPreferencias.DataSource, (DataTable)dgvTemporalidad.DataSource, cbClave.Text);
                MessageBox.Show("Guardado satisfactoriamente");
            }
            catch (Exception exc) 
            {
                
                MessageBox.Show("Se produjo un error al tratar de guardar." +
                                    Environment.NewLine + exc.ToString(), "Error");
            }
        }
        private void adicionarColumnaTemporalidad()
        {
                DataGridViewComboBoxColumn temporalidad = new DataGridViewComboBoxColumn();
                temporalidad.HeaderText = "Periosidad";
                temporalidad.Name = "Periosidad";
                try
                {
                    XmlDocument docMCDS = new XmlDocument();
                    docMCDS.Load(FormPrincipal.Instance.TilesFolder + "\\configMCDS.xml");
                    XmlNodeList nodoTemporalidad = docMCDS.SelectNodes("MCDS/Temporalidades/Temporalidad");
                    for (int i = 0; i < nodoTemporalidad.Count; i++)
                    {
                        temporalidad.Items.Add(nodoTemporalidad[i].InnerText);
                    }
                    if (dgvTemporalidad.DataSource != null)
                    {
                        dgvTemporalidad.Columns.Insert(1, temporalidad);
                        dgvTemporalidad.Refresh();
                        setearValoreCombos();
                    }
                }
                catch (Exception e) { }
        }
        private void setearValoreCombos() 
        {
            DataGridViewComboBoxCell celda= new DataGridViewComboBoxCell();
            for (int i = 0; i < dgvTemporalidad.Rows.Count; i++) 
            {
                celda = (DataGridViewComboBoxCell)dgvTemporalidad.Rows[i].Cells["Periosidad"];
                celda.Value = dgvTemporalidad.Rows[i].Cells["TempPeriosidad"].Value.ToString();
            }
            dgvTemporalidad.Columns["TempPeriosidad"].Visible = false;
            //dgvTemporalidad.Columns.Remove("TempPeriosidad");
        }

        private void dgvTemporalidad_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            
            
            if (dgvTemporalidad.Columns["Periosidad"].Index == dgvTemporalidad.CurrentCell.ColumnIndex)
            {
                ComboBox cbxPeriosidad = (ComboBox)e.Control;
                if (cbxPeriosidad != null)
                {
                    cbxPeriosidad.SelectionChangeCommitted -= new EventHandler(combo_SelectionChangeCommitted);
                    cbxPeriosidad.SelectionChangeCommitted += new EventHandler(combo_SelectionChangeCommitted);
                }
            }

            if (dgvTemporalidad.Columns["Temporalidad"].Index == dgvTemporalidad.CurrentCell.ColumnIndex)
            {
                TextBox txt = e.Control as TextBox;
                txt.KeyPress += OnlyNumbers_KeyPress;
            }

        }
        private void combo_SelectionChangeCommitted(object sender, EventArgs e)
        {
            try
            {
                ComboBox combo = sender as ComboBox;
                if (combo != null)
                {
                    dgvTemporalidad.CurrentRow.Cells["TempPeriosidad"].Value = combo.SelectedItem.ToString();
                    if (combo.SelectedItem.ToString().Equals("Siempre"))
                    {
                        dgvTemporalidad.CurrentRow.Cells["Temporalidad"].ReadOnly = true;
                        dgvTemporalidad.CurrentRow.Cells["Temporalidad"].Value = "";
                    }
                    else 
                    {
                        dgvTemporalidad.CurrentRow.Cells["Temporalidad"].ReadOnly = false;
                    }
                }
            }
            catch (Exception exc) { }
        }
    }
}
